﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Logica.Clases;
using vudu.EnlaceDatos.SqlServer;
using AjaxControlToolkit;

namespace vudu.PaginasWeb.G6Pensum
{
    public partial class ConsultarPlanEstudio : System.Web.UI.Page
    {

        int _numeroPensum;
        int _numeroEscuela;
        private Escuela nuevaEscuela = new Escuela();
        private Pensum nuevoPensum = new Pensum();

        protected void Page_Load(object sender, EventArgs e)
        {
            //Obejto del tipo sesion
            string miRol = (string)Session["rol"];
            if (miRol != "Estudiante")
                Response.Redirect("../G3AccesoSistema/InicioSistema.aspx");
            Estudiante alumno = (Estudiante)Session["Usuario"];
           try
            {
                _numeroPensum = (int)(Session["idMiPensum"]);
                _numeroEscuela = (int)(Session["idMiEscuela"]);
                nuevoPensum.IdPensum = _numeroPensum;
                nuevaEscuela.IdEscuela = _numeroEscuela;
                nombreAlumno.Text = "Alumno(a): " + alumno.Nombre + " " + alumno.Apellido;
                nuevoPensum.ListaPrelaciones = consultarPensum(nuevoPensum, nuevaEscuela);
                List<int> Periodos = numeroPeriodos(nuevoPensum.ListaPrelaciones);
                acordeonSemestral(Periodos, nuevoPensum.ListaPrelaciones);
            }
            catch (Exception)
            {
                mensaje.Text = "Error: No se puede conectar a la base de datos";
                mensaje.CssClass = "transaccionFallida";
                mensaje.Visible = true;
            }

        }

        /// <summary>
        /// Metodos para consultar un pensum
        /// </summary>
        /// <param name="NuevoPensum">se necesita el el objeto pensum</param>
        /// <param name="NuevaEscuela">se necesita el el objeto escuela </param>
        /// <returns>Se obtiene un acordeon, con la cantidad de semestres de un pensum (soporta semestres variables)</returns>
        private List<Prelacion> consultarPensum(Pensum NuevoPensum, Escuela NuevaEscuela)
        {
            //crea una lista de prelaciones (todos los semestres)
            List<Prelacion> semestres = NuevoPensum.ConsultarPrelaciones(NuevaEscuela, NuevoPensum);
            //recorer la lista semestres para asignar las prelaciones
            foreach (Prelacion materiaSemestre in semestres)
            {
                List<Materia> condiciones = new List<Materia>();
                condiciones = materiaSemestre.MostrarListaPrelacion(NuevoPensum, materiaSemestre.MiMateriaPensum);
                foreach (Materia requisito in condiciones)
                {
                    materiaSemestre.Prelaciones.Add(requisito);

                }
            }
            return semestres;


        }

        //metodo que calcula el numero de periodos dentre de ese pensum
        private List<int> numeroPeriodos(List<Prelacion> semestres)
        {
            List<int> periodosTotales = new List<int>();

            foreach (Prelacion numeroPerido in semestres)
            {
                if (periodosTotales.Contains(numeroPerido.SemestreMateriaPensum)) ;
                
                else periodosTotales.Add(numeroPerido.SemestreMateriaPensum);
            }
            return periodosTotales;
        }

        //Metodo encargado de graficar un acordeon de semestes
        private void acordeonSemestral(List<int> periodos, List<Prelacion> materiasPeriodo)
        {
            Label lbTitle;
            Label lbContent;
            AjaxControlToolkit.AccordionPane pn;
            //se itera por cada periodo que haya en ese pensum
            foreach (int numeroPeriodo in periodos) 
            {
                lbTitle = new Label();
                lbContent = new Label();
                lbTitle.Text = "Semestre " + (numeroPeriodo).ToString();
                lbContent.Text = "Total de unidades de crédito: " + totalUC((numeroPeriodo), materiasPeriodo).ToString();
                pn = new AjaxControlToolkit.AccordionPane();
                pn.ID = "Pane" + numeroPeriodo;
                pn.HeaderContainer.Controls.Add(lbTitle);
                pn.ContentContainer.Controls.Add(lbContent);
                AccordionCtrl2.Panes.Add(pn);
                //se crea la tabla donde se muestra las materias de un semestre
                Table tablaMaterias = new Table();
                TableRow cabecera = new TableHeaderRow();
                cabecera.Attributes.Add("style", "text-align: left;");
                //nombre de las etiquetas de la cabecera     
                string[] titulos = {"Materia: ","Unidades de crédito (UC): ","Horas teóricas ",
                                          "Horas Prácticas ","Tener aprobado: "};
                for (int numeroColumna = 0; numeroColumna < titulos.Length; numeroColumna++)
                {
                    TableHeaderCell campoCabera = new TableHeaderCell();
                    Label titulo = new Label();
                    titulo.ID = "campoCabera" + numeroColumna;
                    titulo.Text = titulos[numeroColumna];
                    campoCabera.Attributes.Add("style", "padding:5px");
                    campoCabera.Controls.Add(titulo);
                    cabecera.Controls.Add(campoCabera);
                }
                //se agregan la cabecera de la tabla y la tabla de materias a un panel del acordeon
                tablaMaterias.Rows.Add(cabecera);
                agregarMateriaTabla((numeroPeriodo), materiasPeriodo, tablaMaterias);
                pn.ContentContainer.Controls.Add(tablaMaterias);
            }
        }

        //metodo que calcula el total de unidades de credito del semestre
        private int totalUC(int p, List<Prelacion> materiasPeriodo)
        {
            int totalSemestralUc = 0;
            foreach (Prelacion prela in materiasPeriodo)
            {
                if (p == prela.SemestreMateriaPensum)
                    totalSemestralUc = totalSemestralUc + prela.CreditoMateriaPensum;
            }

            return totalSemestralUc;
        }

        //metodo que crea la tabla de materias
        private void agregarMateriaTabla(int _numeroPeriodo, List<Prelacion> semestre, Table tablaMaterias)
        {
            int numeroFila = 0;
            foreach (Prelacion misMateriaPeriodos in semestre)
            {
                if (misMateriaPeriodos.SemestreMateriaPensum == _numeroPeriodo)
                {
                    TableRow fila = new TableRow();
                    fila.ID = "numeroFila" + numeroFila;
                    //celda con materia del semestre
                    TableCell celda = new TableCell();
                    Label campo = new Label();
                    campo.ID = "campo_no" + numeroFila;
                    campo.Text = misMateriaPeriodos.MiMateriaPensum.Nombre;
                    celda.Controls.Add(campo);
                    celda.Attributes.Add("style", "border-bottom:2px;border-color: gray;border-style: solid;");
                    fila.Cells.Add(celda);
                    //celda con unidades de credito
                    TableCell celda1 = new TableCell();
                    Label campo1 = new Label();
                    campo1.ID = "campo_no" + numeroFila;
                    campo1.Text = "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;" + misMateriaPeriodos.CreditoMateriaPensum.ToString();
                    celda1.Controls.Add(campo1);
                    celda1.Attributes.Add("style", "border-bottom:2px;border-color: gray;border-style: solid;");
                    fila.Cells.Add(celda1);
                    //celda con la horas de teoria
                    TableCell celda2 = new TableCell();
                    Label campo2 = new Label();
                    campo2.ID = "campo_no" + numeroFila;
                    campo2.Text = "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;" + misMateriaPeriodos.MiMateriaPensum.HorasTeoria.ToString();
                    celda2.Controls.Add(campo2);
                    celda2.Attributes.Add("style", "border-bottom:2px;border-color: gray;border-style: solid;");
                    fila.Cells.Add(celda2);
                    //celda con la horas de practica
                    TableCell celda3 = new TableCell();
                    Label campo3 = new Label();
                    campo3.ID = "campo_no" + numeroFila;
                    campo3.Text = "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;" + misMateriaPeriodos.MiMateriaPensum.HorasPractica.ToString();
                    celda3.Controls.Add(campo3);
                    celda3.Attributes.Add("style", "border-bottom:2px;border-color: gray;border-style: solid;");
                    fila.Cells.Add(celda3);
                    //celda con las materias que prenlan esta materia
                    string materiasNecesaria = "";
                    foreach (Materia condicion in misMateriaPeriodos.Prelaciones)
                        materiasNecesaria = condicion.Nombre + "<br />" + materiasNecesaria;
                    TableCell celda4 = new TableCell();
                    Label campo4 = new Label();
                    campo4.ID = "campo_no" + numeroFila;
                    campo4.Text = materiasNecesaria;
                    celda4.Controls.Add(campo4);
                    celda4.Attributes.Add("style", "border-bottom:2px;border-color: gray;border-style: solid;");
                    fila.Cells.Add(celda4);
                    //se completa la fila y se añade a la tabla
                    tablaMaterias.Rows.Add(fila);
                    numeroFila++;
                }
            }
        }

    }
}